SQL INJECTION
SQL Injection Nedir Nasıl Tespit Edilir?
SQL (Structured Query Language), müşteri-kullanıcı gibi bilgilerin bulunduğu yer yani veri tabanıdır (data base). Saldırganın çeşitli yerlere sql sorguları girmesi ile bir sunucudan veri çekmesine veya bir kullanıcı ekleyip silmesine çeşitli işlemler yapabilmesine sql injection deriz.
Peki Nasıl Tespit Edilir?
Kullanıcının arka planda sorgu yapabildiği her yerde bu testler yapılabilmektedir. Hatta bir template html sayfalarında da deneme yapılabilir. Kullanıcının doğrudan veri tabanı ile alaksı olan login sayfalarında da test edilebilir. Tespit aşamasında direkt olarak bir tablo sayısını tutturmaya çalışmak bu açığın varlığını test etmede bir hayli zaman kaybı olur bu yüzden daha basit kodlar denemekte fayda var örneğin bir https://alperencoskun.com/adsad/deneme?php=2121 url üzerinde tek sayılı bir tırnak işareti ile sayfanın hata vermesini inceleyebiliriz. Örnek:
https://alperencoskun.com/adsad/deneme?php=2121’’’ şeklinde deneme yapabiliriz tırnak sayısını çift tek olarak da deneyebiliriz çünkü bu bölüm aslında developerın da düzenlemelerine göre kısmen de olsa değişiklik gösterebilir.
Url veya input yerinde bir sql sleep kodu çalıştırabiliriz. Bu tespit aşamalarında BurpSuite Repeater aracını kullanmak önemlidir. Çünkü kör sql (blind sql) olabilir yani direkt olarak sayfada gözükmez fakat response bölümünde karşımıza çıkabilir. Veya sleep kodunu tam olarak anlayamayabiliriz bu da repeater aracında gecikme süresini daha rahat bir şekilde anlamamızı sağlayabilir.
Önemli olan nokta da şu 10 dan fazla veri tabanı çeşidi olduğu için veri tabanı yapısını anlamamız gerekiyor. Genelde küçük farklar var örneğin ORDER BY 1 ; şeklinde olabilir veya sonu #,-- şekillerinde de olabilir. Aktif-pasif taramalarda hangi veri tabanı çeşidi kullanıldığını bilmiyorsak veya direkt olarak anlayamıyorsak manuel de sayfa cevaplarını bu şekilde test edebiliriz.
Daha iyi anlamak adına PortSwigger’ın labını çözelim
Burada direkt olarak category parametresine sayfa üzerinde tıkladığımız kategori sekmelerini ve çalışma methodunu vermiş bunu url üzerinde görelim
https://acb91f411sadasdasda.web-security-academy.net/filter?category=Gifts
Yukarıda category=Gifts te gördüğümüz gibi yani Gifts yerine bir tırnak eklediğimizde muhtemelen bir hata alacağız.
Yukarıdaki gibi server error aldık bunu syntax error gibi çeşitli şekilde görebiliriz.
Şimdi ‘ or 1=1--sorgusu çalıştırmayı ve sayfada olan veya olmayan ürünleri getirmiş olacağız.
Ve başarılı olduk bir sorgu çalıştırmış olduk. Gerçek bir web sitesinde Order By gibi komutları kullanarak veri tabanı kolon hakkında bilgi edinebiliriz.
Bir başka labaratuvarını inceleyelim.
Burada da administrator olarak giriş yapmamızı istiyor.
Access the lab dedikten sonra my account bölümünden giriş yapmayı deneyeceğiz.
Burada kullanıcı adını administrator olarak gireceğim fakat şifreyi ‘ or 1=1—şeklinde deneme yaparak giriş yapmayı deneyeceğim.
Ve direkt olarak giriş yapabildik.
Ek bilgi olarak gerçek bir web sitesinde bu tür saldırılarda tespit aşamasında doğru kullanıcı adı ve doğru şifre’ aNd 5465=5465-- şeklinde yapılan denemeler veya çeşitli encoding yaparak daha rahat sonuca ulaştırabilir.
Bu güvenlik açığından bir lab daha çözelim bunun sebebi ne kadar çok mantığını anlarsak ve yöntemlerini anlarsak daha iyi olur.
Bu labaratuvarda BurpSuite de kullanarak union ile kolon sayısını bulacağız. Bunun amacı gerçek bir web sitesinde kolon sayısını bulduğumuzda kolon sayısını dikkate alarak kolonlar üzerine sorgu yapabilmemiz. Yani
‘Union select null-- bir sonraki adımda ‘Union select null,null-- şeklinde en son kolon sayısını doğruladığımızda, ‘Union select null , null, kullanici_adi-- şeklinde sorgu yapabileceğiz. Şimdi çözüme geçelim:
İlk aşamada böyle bir hata aldık devam ediyoruz.
Ve tablo sayısını ‘Union select null,null, null-- şeklinde bulduk. Yani saldıracağımız veri tabanında 3 tane kolon var. Bu şekilde bulduk.
Bir sonraki labaratuvar da bunun devamı bir de kolon ismini ve yerini öğrenelim:
Burada kolonu bulduktan sonra kolonun ismini ve yerini bulmamız gerektiğini söylüyor.
Sorguda bize kolon ismi ile ilgili bir bilgi verdi. Şimdi bu kolon isminin hangi kolona ait olduğunu öğrenmemiz gerekiyor.
Yukarıdaki gibi 3. Kolonun ismi ‘3iL8DW’ değilmiş. 2. Kolonda deneyeceğiz.
Ve bulunduğu kolonu da bularak labaratuvarı tamamlamış olduk.
Peki Gerçek Web Sitelerinde de Laboratuvarlardaki Gibi Çıkar Mı?
Son 2 çözdüğümüz labaratuvar gerçek web sitelerine biraz daha yakın ama direkt olarak bize kolon ismini vermeyebilir karşımıza sayı olarak çıkabilir veya sadece 200 cevabını alabiliriz. Brute force denemeleri yapma durumunda kalabiliriz. Veya bir enjeksiyon kodunu encoding yaparak 200 cevabını almayı başarabiliriz. ORDER BY null, null, ... asdasdsd; şeklinde farklı veri tabanları ile karşılaşıp tespit edebiliriz. Yani birden fazla veritabanı çeşidi olduğu için farklı denemeler yapmakta büyük fayda var. Ek olarak sqlmap aracını kullanmak yerine manuel denemeler sonuca ulaşmamız için daha verimli olabilir kullanacaksak da doğru parametreler ile kullanım gereklidir, direkt default şekilde çalıştırmak bir güvenlik açığı varsa bile ulaşamayabiliriz.
Aşağıda Birkaç SQL Injection Örnek Raporlarını Bulabilirsiniz:
https://hackerone.com/reports/295841
https://hackerone.com/reports/1039315
https://hackerone.com/reports/952501
https://hackerone.com/reports/868436